package bosque.unc;

import java.util.HashMap;

import bosque.unc.enumerations.Sensor;

/**
 * 
 * hilo que se encarga de la lecturas de los sensores
 * lee los sensores mientras esten activados (cada sensor tiene un flag)
 *
 */
public class LecturaSensor extends Thread {

	private Integer delayLoop 						   = 100;
	
	private final Integer delayAdc 					   = 500000;
	private Lecturas lecturas;
	private Integer lectura8msb 					   = 0;
	private Integer lectura2lsb 					   = 0;
	private Integer lecturaSensor 					   = 0;
	private Boolean lecturaSensorActivada 			   = true;
	

	public LecturaSensor(Lecturas lec, Integer dly){
		this.lecturas = lec;
		this.delayLoop  = dly;
		

	}

	

	public void run(){
		while(lecturas.getLecturaSensoresActivada())
		{
						
				if(this.lecturas.isSensorActivo(Sensor.CUPULA)) leerSensor(Sensor.CUPULA);
				if(this.lecturas.isSensorActivo(Sensor.ESPEC_X)) leerSensor(Sensor.ESPEC_X);
				if(this.lecturas.isSensorActivo(Sensor.ESPEC_Y)) leerSensor(Sensor.ESPEC_Y);
				if(this.lecturas.isSensorActivo(Sensor.ESPEC_RED)) leerSensor(Sensor.ESPEC_RED);
				if(this.lecturas.isSensorActivo(Sensor.FINES_CARRERA)) leerSensor(Sensor.FINES_CARRERA);
				if(this.lecturas.isSensorActivo(Sensor.PLATAF_AD_AF)) leerSensor(Sensor.PLATAF_AD_AF);
				if(this.lecturas.isSensorActivo(Sensor.PLATAF_AR_AB)) leerSensor(Sensor.PLATAF_AR_AB);
				if(this.lecturas.isSensorActivo(Sensor.TEMP_ESPEJO)) leerSensor(Sensor.TEMP_ESPEJO);
				if(this.lecturas.isSensorActivo(Sensor.TEMP_EXTERIOR)) leerSensor(Sensor.TEMP_EXTERIOR);
				if(this.lecturas.isSensorActivo(Sensor.FUNCIONAMIENTO)) leerSensor(Sensor.FUNCIONAMIENTO);
				
				else{
					//System.out.println("Bucle sensor");
;					try
					{
						Thread.sleep(delayLoop);
					} catch (InterruptedException e)
					{

						e.printStackTrace();
					}
				}
											
		}		
		
	}
	
	private synchronized void leerSensor(Sensor sens) 
	{	
		/* mandar un 0 antes de interrupcion de fines de carrera */
		if(sens.equals(Sensor.FINES_CARRERA))
		{
			this.lecturas.getInteprete().accionInterrupcion(Sensor.CERO);
		}
		else { }
		
		//System.out.println("int8sb " + sens);
		this.lecturas.getInteprete().accionInterrupcion(sens);
		
		try
		{
			Thread.sleep(0, this.delayAdc);
			
		} catch (InterruptedException e)
		{
			
			e.printStackTrace();
		}
		//System.out.println("int2sb " + sens);
		this.lectura8msb = this.lecturas.getInteprete().lecturaPIC();
		//System.out.println("lec8msb " + sens + " : " + this.lectura8msb);
		if(sens.equals(Sensor.CUPULA) || sens.equals(Sensor.ESPEC_X) 
				|| sens.equals(Sensor.ESPEC_Y) || sens.equals(Sensor.ESPEC_RED))
		{				
			this.lecturas.getInteprete().accionInterrupcion(Sensor.LS2BITS);
			try
			{
				Thread.sleep(0, this.delayAdc);
			} catch (InterruptedException e)
			{
				
				e.printStackTrace();
			}
			this.lectura2lsb = this.lecturas.getInteprete().lecturaPIC();
			//System.out.println("lec2lsb " + sens + " : " + this.lectura2lsb);
			
			//System.out.println((this.lectura2lsb >> 6) & 0x03);
//			this.lecturaSensor = (this.lectura8msb.byteValue() << 2) + ((this.lectura2lsb.byteValue() >> 6) & 0x03); 
			this.lecturaSensor = (this.lectura8msb << 2) + ((this.lectura2lsb >> 6) & 0x03); 

		}
		else
		{
			this.lecturaSensor = this.lectura8msb;
		}
		this.lecturas.getSensores().put(sens, this.lecturaSensor);
		
		try
		{
			Thread.sleep(this.delayLoop);
		} catch (InterruptedException e)
		{
			
			e.printStackTrace();
		}
		this.notifyAll();
	}
	
	



	public Boolean getLecturaSensorActivada() {
		return lecturaSensorActivada;
	}



	public void setLecturaSensorActivada(Boolean lecturaSensorActivada) {
		this.lecturaSensorActivada = lecturaSensorActivada;
	}
	
	
	
}

